#Requires AutoHotkey v2.0

; 脚本核心对象
clip := {

    ; 是否启用热键(0 不启用, 1 启用)
    hotkeyEnabled: 1,

    ; 配置文件路径			   
    configFile: A_ScriptDir "\batData.properties",

    ; 数据文件路径 
    dataFile: A_ScriptDir "\data.txt", 

    ; texts 初始化为空数组            
    texts: [], 

    ; 数据文件为空时粘贴的默认文本                                    
    defText: "#无数据#",

    ; 初始索引为 1（AutoHotkey 数组从 1 开始）			   
    index: 1, 

    ; 是否保留索引（1 保留，0 不保留）                                   
    keepIndex: 0,

    ; 上次检测的文件大小			   
    dataFileSize: 0,  

    ; 数据文件是否改变（0 未改变，1 已改变）
    dataFileChanged: 0,

    ; 数据模型(LIST 序列,AUTO-INCREMENT 自增)                             
    dataModel: "LIST",

    ; 数据模型不可改变(0 可以改变, 1 不可改变)
    dataModelFinal: 0
    
}
readFile(clip.dataFile)

; 读取文件内容的函数
readFile(filePath) {

    global clip ; 声明全局变量
    fileContent := FileRead(filePath)  ; 使用函数风格读取文件内容
    lines := StrSplit(fileContent, "`n") ; 按行分割文件内容
    
    ; texts 初始化为空数组
    clip.texts :=[]
    
    ; 分析数据模型
    if(clip.dataModelFinal = 0){
        if (InStr(fileContent, "[$AUTO-INCREMENT$]")) {
            clip.dataModel := "AUTO-INCREMENT"
        } else { ; 默认数据模型为LIST
            clip.dataModel := "LIST"
        }
        
    }
    
    ; AUTO-INCREMENT模式的处理方式
    if(clip.dataModel = "AUTO-INCREMENT"){
        MsgBox "自增模型待完善"
        Exit
    }

    ; LIST模式的处理方式
    if(clip.dataModel = "LIST"){

        ; 去除每行的换行符并检查空行
        for index, line in lines {
    	    trimmedLine := Trim(line, "`r`n")
            if (trimmedLine != "") {
                clip.texts.Push(trimmedLine)
            }
        }
        clip.dataFileSize := GetFileSize(clip.dataFile)
        return
    }
}

; ----- 函数(复用) -----

; 用于转义特殊字符的函数
EscapeSpecialChars(str) {
    ; 定义需要转义的特殊字符及其替换值
    specialChars := ["#", "!", "^", "+","[", "]"]
    replacements := ["{#}", "{!}", "{^}", "{+}", "{[}", "{]}"]

    ; 循环遍历特殊字符数组，进行替换
    Loop specialChars.Length {
        str := StrReplace(str, specialChars[A_Index], replacements[A_Index])
    }
    Return str
}

; 检查文件大小变化的函数(fileToCheck 文件，上次检查时文件的大小)
CheckFileChange(fileToCheck, lastSize) {
    ; 获取当前文件大小
    fileSize := FileGetSize(fileToCheck)

    ; 检查文件大小是否变化
    if (fileSize != lastSize) {
        lastSize := fileSize
	; 文件大小未发生变化返回1
        return 1
    }

    ; 文件大小未发生变化返回0
    return 0
}


; 获取文件大小的辅助函数
GetFileSize(fileToCheck) {
    file := FileOpen(fileToCheck, "r")
    if !file
        return -1  ; 返回 -1 表示文件打开失败

    fileSize := file.Length
    file.Close()
    return fileSize
}


